package nio;

import java.io.IOException;
import java.nio.ByteBuffer;

public class BufferDemo {

    public static void main(String[] args) throws IOException {
        //分配buffer
        ByteBuffer buf = ByteBuffer.allocate(48);

        //将channel中的数据写入buffer
        //int bytesRead = inChannel.read(buf); //read into buffer.
        buf.put("使用put写入buffer".getBytes());

        //用 flip() 方法将 Buffer 从写入模式切换到读取模式。
        //调用 flip() 将 position 设置回0，并将 limit 置为刚才的位置。
        //换句话说，position 现在标记了读取位置，limit 标记了写入缓冲区的字节、字符数等——可以读取的字节数、字符数等的限制。
        buf.flip();

        //将buffer中数据写入到channel  OR  channel读取buffer
        //int bytesWritten = inChannel.write(buf);
        //使用get方法将buffer中数据读出
        byte b = buf.get();


        //从 Buffer 中读取数据之后，必须让 Buffer 为再次写入做好准备。您可以通过调用 clear() 或调用 compact()来做到这一点。
        //如果您调用 clear() ，position 将被设置为0，并 limit 置为 capacity。
        // 换句话说，Buffer 被清除。Buffer 中的数据没有清除。只有标记告诉您可以将数据写入 Buffer 的位置。
        //当您调用 clear() 时，如果缓冲区中有任何未读数据，则数据将被“遗忘”，这意味着您不再有任何标记来说明哪些数据已被读取，哪些数据未被读取。

        //如果 Buffer 中仍然有未读数据，并且您希望稍后读取它，但是您需要先写一些东西，那么调用 compact() 而不是 clear().
        //compact() 将所有未读的数据复制到 Buffer 的开头。然后将 position 设置为最后一个未读元素之后的位置。
        // 与 clear() 一样，limit 属性仍然设置为 capacity。现在 Buffer 已经准备好写入，但是不会覆盖未读数据。
    }

}
